package com.xuecheng.checkcode.service;

import com.xuecheng.checkcode.model.GenerateCheckCodeParamsDTO;
import com.xuecheng.checkcode.model.CheckCodeResultDTO;

/**
 * @author 勾新杰
 * @version 1.0
 * @description 验证码接口，策略+组合，不同的实现类对应不同的策略，不同的组件对应关系相关度强
 * @date 2022/9/29 15:59
 */
public interface CheckCodeService {

    /**
     * 生成验证码
     * @param generateCheckCodeParamsDTO 生成验证码的参数
     * @return 验证码结果
     */
    CheckCodeResultDTO generate(GenerateCheckCodeParamsDTO generateCheckCodeParamsDTO);

    /**
     * 校验验证码
     * @param key 验证码对应的key
     * @param code 验证码
     * @return 校验结果，有效为true
     */
    boolean verify(String key, String code);

    /**
     * 生成验证码的生成器
     */
    interface CheckCodeGenerator {

        /**
         * 生成验证码
         * @param length 验证码长度
         * @return 返回验证码
         */
        String generate(int length);
    }

    /**
     * key生成器
     */
    interface KeyGenerator {

        /**
         * key生成
         * @param prefix 前缀
         * @return 验证码对应的key
         */
        String generate(String prefix);
    }

    /**
     * 验证码存储
     */
    interface CheckCodeStore {

        /**
         * 设置存储验证码，并设置过期时间
         * @param key 验证码对应的key
         * @param value 验证码
         * @param expire 过期时间，单位分钟
         */
        void set(String key, String value, Integer expire);

        /**
         * 获取验证码
         * @param key 验证码对应的key
         * @return 验证码
         */
        String get(String key);

        /**
         * 删除验证码
         * @param key 验证码对应的key
         */
        void remove(String key);
    }
}
